/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ComNo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author 6766371
 */
public class Cliente implements Runnable {

    private static int flag;
    private static String servidor;
    private static int servPorta;
    private List<String> files;                     //armazena a lista de arquivos que possui
    //Variáveis para tratar erros
    private final static int FALHA = 0;
    private final static int SUCESSO = 1;
    private final static int ARQEXISTENTE = 2;      //arquivo que está tentando ser criado já existe
    private final static int UKERRO = 3;            //erro desconhecido
    private final static int SERVERNOTFOUND = 4;

    public String getServidor() {
        return servidor;
    }

    public void setServidor(String servidor) {
        Cliente.servidor = servidor;
    }

    public int getServPorta() {
        return servPorta;
    }

    public void setServPorta(int servPorta) {
        Cliente.servPorta = servPorta;
        files = new ArrayList<String>();
    }

    public void Criar(BufferedReader br) throws IOException {
        String nArq;
        String entrada;                 //em caso de arquivo já existente a reopção é recebida por essa variável
        int statusCria = FALHA;


        System.out.println("Nome do arquivo: ");
        while (statusCria != SUCESSO) {
            nArq = br.readLine();
            NoComCliente cliente = new NoComCliente(getServidor(), getServPorta(), nArq);
            statusCria = cliente.CriaArquivo();

            switch (statusCria) {
                case SUCESSO:
                    files.add(nArq);
                    break;
                case FALHA:
                    System.out.println("Falha no sistema. Digite o nome do arquivo novamente: ");
                    break;
                case ARQEXISTENTE:
                    System.out.println("Arquivo existente:\n"
                            + "(1) Criar arquivo novamente com outro nome\n"
                            + "(2) Copiar o arquivo existente");          //verificar se cliente deseja ler o arquivo existente
                    entrada = br.readLine();
                //implementar o q o cliente escolheu
                    if(entrada.equalsIgnoreCase("1")){
                        statusCria = FALHA;
                        break;
                    }
                    else if(entrada.equalsIgnoreCase("2")){
                        Ler(br);
                        statusCria = SUCESSO;
                        break;
                    }
                case UKERRO:
                    System.out.println("Erro!\n Digite o nome do arquivo novamente: ");
                    break;
                case SERVERNOTFOUND:
                    System.out.println("Servidor nao encontrado. Redefina o servidor.");
                    break;
            }
        }
    }

    public void Excluir(BufferedReader br) throws IOException {
        String nArq;
        int index = -1;
        int statusExcluir = FALHA;


        System.out.println("Arquivo buscado: ");

        while (statusExcluir != SUCESSO) {
            nArq = br.readLine();

            NoComCliente clnt = new NoComCliente(getServidor(), getServPorta(), nArq);
            statusExcluir = clnt.ExcluirArquivo();

            switch (statusExcluir) {
                case SUCESSO:
                    files.remove(nArq);
                    break;
                case FALHA:
                    System.out.println("Arquivo inexistente. Digite o nome do arquivo novamente: ");
                    break;
                case ARQEXISTENTE:
                    statusExcluir = SUCESSO;
                    break;
                //implementar o q o cliente escolheu
                case UKERRO:
                    System.out.println("Erro!\n Digite o nome do arquivo novamente: ");
                    break;
                case SERVERNOTFOUND:
                    System.out.println("Servidor nao encontrado. Redefina o servidor.");
                    break;
            }
        }
    }

    public void Ler(BufferedReader br) throws IOException {
        String nArq;

        System.out.println("Arquivo buscado: ");
        nArq = br.readLine();

        NoComCliente clnt = new NoComCliente(getServidor(), getServPorta(), nArq);
        clnt.CopiarArquivo();                //realiza a operacao do cliente, requisicao de arquivo
    }

    @Override
    public void run() {
        while (true) {
            try {
                System.out.println("Digite a operacao desejada: \n"
                        + "(1) Ler\n"
                        + "(2) Excluir\n"
                        + "(3) Criar\n");

                //lê do teclado a operação desejada pelo usuário
                InputStreamReader in = new InputStreamReader(System.in);
                BufferedReader br = new BufferedReader(in);

                String entrada = new String();
                do {

                    entrada = br.readLine();

                } while (((entrada.compareTo("1")) != 0) && ((entrada.compareTo("2")) != 0) && ((entrada.compareTo("3")) != 0));

                flag = Integer.parseInt(entrada);
                if (flag == 1) {                 //se o no quiser requisitar um arquivo
                    Ler(br);
                } else if (flag == 2) {                     // se o nó tiver que enviar um arquivo
                    Excluir(br);
                } else if (flag == 3) {                     // se o nó tiver que enviar um arquivo
                    Criar(br);
                }

            } catch (IOException ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
